package com.mashibing.class02;

/**
 * @Auther: huangxiaode
 * @Date: 2024-01-29 - 01 - 29 - 19:46
 * @Description: com.mashibing.class02
 * @version: 1.0
 */
public class Code02_RandToRand {

    public static void main(String[] args) {
        System.out.println("测试开始");
        //Math.random()
        int testTimes = 10000000;
        int count = 0;
        for (int i = 0; i < testTimes; i++) {
            if (Math.random() < 0.75){
                count++;
            }
        }
    //    System.out.println((double) count / (double) testTimes);
        System.out.println("==================================");
        //[0,1) -> [0,8)
        count = 0;
        double ans = Math.random()* 8;
        for (int i = 0; i < testTimes; i++) {
            if (Math.random()*8 < 5){
                count++;
            }
        }
     //   System.out.println((double) count / (double) testTimes);

        int K = 9;
        //[0,8]
        int iAns = (int) (Math.random()*K);
        int[] counts = new int[9];//count[0] 0出现的次数 counts[1] 1出现的次数
        for (int i = 0; i < testTimes; i++) {
            int nAns = (int) (Math.random()*K);// [0,k-1]
            counts[nAns]++;
        }
        for (int i = 0; i < K; i++) {
            System.out.println(i + "这个数,出现了 " + counts[i] + " 次");
        }
        System.out.println("========================================");
        count = 0;
        double x = 0.17;
        for (int i = 0; i < testTimes; i++) {
            if (xToXPower3()<x){
                count++;
            }
        }
        System.out.println((double) count / (double) testTimes);
        System.out.println(Math.pow(x, 3));

        System.out.println("=======================================");
        count=0;
        for (int i = 0; i < testTimes; i++) {
            if (f2()==0){
                count++;
            }
        }
        System.out.println((double) count / (double) testTimes);

        System.out.println("=======================================");
        counts = new int[8];
        for (int i = 0; i < testTimes; i++) {
            int num = g();
            counts[num]++;
        }
        for (int i = 0; i < 8; i++) {
            System.out.println(i + "这个数,出现了 " + counts[i] + " 次");
        }
    }

    // 返回[0,1)的一个小数
    // 对于任意x, x属于[0,1),[0,x)范围上的数出现概率由原来的x调整为x的平方
    public static double xToXPower2(){
        return Math.max(Math.random(),Math.random());
    }

    public static double xToXPower3(){
        return Math.max(Math.random(),Math.max(Math.random(),Math.random()));
    }


    // lib里面的,不能改
    public static int RandomOneToFive(){
        return (int) (Math.random()*5) + 1;
    }
    // 随机机制, 只能用f1
    // 等概率返回0和1
    public static int f2(){
        int ans = 0;
        do {
            ans = RandomOneToFive();
        }while (ans == 3);
        return ans < 3 ? 0 : 1;
    }

    // 得到000 ~ 111 做到等概率事件 这个函数其实就做到了 0 ~ 7 等概率返回。
    public static int f3(){
        return  (f2()<<2)+(f2()<<1)+(f2()<<0);
    }

    // 0 ~ 6 等概率返回一个
    public static int f4(){
        int ans = 0;
        do {
            ans=f3();
        }while (ans==7);
        return ans;
    }

    public static int g(){
        return f4()+1;
    }

    // 你只能知道 x会以固定概率返回0和1, 但是x的内容 你看不到!
    public static int x(){
        return Math.random() < 0.84 ? 0 : 1;
    }

    // 等概率返回 0 和 1
    public static int y(){
        int ans = 0;
        do {
            ans = x();
        }while (ans==x()); // 第一次的值和第二次的值相同的话,直接重做.
        // 只有两次随机的值不相同的话, 会跳出whihle循环.
        return ans;
    }

}
